"""
MCP工具主入口文件
实现网页内容处理的命令行工具和MCP服务器
"""
import os
import logging
import sys
import threading
import argparse
from pathlib import Path


 
sys.stdout.reconfigure(encoding='utf-8')
sys.stderr.reconfigure(encoding='utf-8')
       
# 配置日志系统 - 集中在一处进行日志配置
def setup_logging(log_level=logging.DEBUG, log_file=None):
    """
    设置日志系统
    
    参数:
        log_level: 日志级别，默认DEBUG
        log_file: 日志文件路径，默认None（输出到控制台）
    """
    # 先检查日志是否已经配置，避免重复配置
    if len(logging.getLogger().handlers) > 0:
        return
        
    # 基本配置
    log_config = {
        'format': '[%(asctime)s][%(process)d][%(thread)d][%(filename)s:%(lineno)d] %(levelname)s: %(message)s',
        'level': log_level,
        'datefmt': '%Y-%m-%d %H:%M:%S',
    }
    
    # 如果指定了日志文件，添加文件处理
    if log_file:
        log_dir = os.path.dirname(log_file)
        if log_dir and not os.path.exists(log_dir):
            os.makedirs(log_dir)
        log_config['filename'] = log_file
        log_config['filemode'] = 'a'  # 追加模式
    
    logging.basicConfig(**log_config)
    
    # 设置第三方库的日志级别，减少不必要的日志输出
    logging.getLogger("urllib3").setLevel(logging.WARNING)
    logging.getLogger("selenium").setLevel(logging.WARNING)
    logging.getLogger("bs4").setLevel(logging.WARNING)
    logging.getLogger("DrissionPage").setLevel(logging.WARNING)
    
    logger = logging.getLogger(__name__)
    logger.debug(f"日志系统初始化完成，级别: {logging.getLevelName(log_level)}")

def create_parser() -> argparse.ArgumentParser:
    """创建命令行参数解析器"""
    parser = argparse.ArgumentParser(
        description="MCP工具 - 网页内容处理与MCP服务器"
    )
    
    # 添加子命令解析器
    subparsers = parser.add_subparsers(dest="command", help="命令")
    
    # 网页搜索命令
    search_parser = subparsers.add_parser("search", help="搜索网页内容")
    search_parser.add_argument(
        "url", 
        nargs="?",
        help="要搜索的网页URL"
    )
    search_parser.add_argument(
        "-f", "--file",
        help="包含URL列表的文件"
    )
    search_parser.add_argument(
        "-o", "--output-dir", 
        default="./results",
        help="结果输出目录 (默认: ./results)"
    )
    search_parser.add_argument(
        "--headless", 
        action="store_true", 
        help="使用无头浏览器模式"
    )
    search_parser.add_argument(
        "--verbose", 
        action="store_true", 
        help="显示详细日志信息"
    )
    search_parser.add_argument(
        "--log-level",
        choices=["debug", "info", "warning", "error", "critical"],
        help="日志级别"
    )
    search_parser.add_argument(
        "--log-file",
        help="日志文件路径"
    )
    search_parser.add_argument(
        "--format",
        choices=["markdown", "text"],
        default="markdown",
        help="输出格式: markdown或text"
    )
    search_parser.add_argument(
        "--extract-mode", 
        choices=["main", "body"],
        default="main",
        help="内容提取模式：main(主内容区，默认)或body(整个body区域)"
    )
    
    # MCP服务器命令
    mcp_parser = subparsers.add_parser("server", help="启动MCP服务器")
    mcp_parser.add_argument(
        "--name",
        default="WebSearch MCP",
        help="服务器名称 (默认: WebSearch MCP)"
    )
    mcp_parser.add_argument(
        "-f", "--file",
        help="包含URL列表的文件"
    )
    mcp_parser.add_argument(
        "-o", "--output-dir", 
        default="./results",
        help="结果输出目录 (默认: ./results)"
    )
    mcp_parser.add_argument(
        "--headless", 
        action="store_true", 
        help="使用无头浏览器模式"
    )
    mcp_parser.add_argument(
        "--stdio",
        action="store_true",
        help="使用标准输入输出模式而不是HTTP服务器"
    )
    mcp_parser.add_argument(
        "--verbose", 
        action="store_true", 
        help="显示详细日志信息"
    )
    mcp_parser.add_argument(
        "--log-level",
        choices=["debug", "info", "warning", "error", "critical"],
        help="日志级别"
    )
    mcp_parser.add_argument(
        "--log-file",
        help="日志文件路径"
    )
    mcp_parser.add_argument(
        "--format",
        choices=["markdown", "text"],
        default="markdown",
        help="输出格式: markdown或text"
    )
    mcp_parser.add_argument(
        "--extract-mode", 
        choices=["main", "body"],
        default="main",
        help="内容提取模式：main(主内容区，默认)或body(整个body区域)"
    )
    
    return parser

def setup_logging_from_args(args):
    """从参数设置日志系统"""
    # 根据verbose参数确定日志级别
    if hasattr(args, 'log_level') and args.log_level:
        log_level_name = args.log_level
    else:
        log_level_name = "debug" if hasattr(args, 'verbose') and args.verbose else "info"
    
    # 映射日志级别
    log_levels = {
        "debug": logging.DEBUG,
        "info": logging.INFO,
        "warning": logging.WARNING,
        "error": logging.ERROR,
        "critical": logging.CRITICAL
    }
    
    # 获取日志级别
    log_level = log_levels.get(log_level_name, logging.INFO)
    log_file = args.log_file if hasattr(args, 'log_file') else None
    
    # 设置日志系统
    setup_logging(log_level=log_level, log_file=log_file)

def main(args=None):
    """
    命令行工具主函数，作为包入口点
    
    参数:
        args: 命令行参数列表，如果为None则使用sys.argv
        
    返回:
        退出码，0表示成功，非0表示错误
    """
    process_id = os.getpid()
    thread_id = threading.get_ident()
    
    # 解析命令行参数
    parser = create_parser()
    args = parser.parse_args(args)
    
    # 设置日志系统
    setup_logging_from_args(args)
    logger = logging.getLogger(__name__)
    logger.info(f"MCP工具启动 [PID:{process_id}][TID:{thread_id}]")
    
    # 根据命令执行不同功能
    exit_code = 0
    try:
        if args.command == "search":
            # 执行网页搜索命令
            from cli.commands import main as search_main
            
            # 正确构建参数列表
            search_args = []
            if args.url:
                search_args.append(args.url)
            if args.extract_mode:
                search_args.extend(['--extract-mode', args.extract_mode])
            if args.format:
                search_args.extend(['--format', args.format])
            if args.output_dir:
                search_args.extend(['--output-dir', args.output_dir])
            if args.headless:
                search_args.append('--headless')
            if args.file:
                search_args.extend(['--file', args.file])
                
            exit_code = search_main(search_args)
        elif args.command == "server":
            # 执行MCP服务器命令
            try:
                # 先检查mcp包是否已安装
                try:
                    import mcp
                except ImportError:
                    logger.error("缺少MCP依赖，请安装: pip install mcp>=1.0.0")
                    print("错误: 缺少必要的依赖 'mcp'。请使用以下命令安装:")
                    print("pip install mcp>=1.0.0")
                    return 1
                
                from mcp_server import WebSearchMCP
                
                # 创建MCP服务器
                mcp_server = WebSearchMCP(
                    name=args.name,
                    output_dir=args.output_dir,
                    headless=args.headless,
                    format=args.format,
                    extract_mode=args.extract_mode,
                    file=args.file
                )
                
                # 根据模式运行服务器
                if args.stdio:
                    logger.info("使用标准输入输出模式启动MCP服务器")
                    mcp_server.run_stdio()
                else:
                    logger.info("启动MCP服务器")
                    mcp_server.run()
            except ImportError as e:
                logger.error(f"无法加载MCP相关模块: {str(e)}")
                print(f"错误: {str(e)}")
                print("请确保已正确安装所有依赖: pip install mcp>=1.0.0 uvicorn>=0.15.0")
                return 1
        else:
            # 默认显示帮助信息
            parser.print_help()
            exit_code = 1
    except Exception as e:
        logger.error(f"执行过程中发生错误: {str(e)}", exc_info=True)
        print(f"错误: {str(e)}")
        exit_code = 1
    
    logger.info(f"MCP工具退出，状态码: {exit_code}")
    return exit_code

# 主入口函数
if __name__ == "__main__":
    sys.exit(main())
